home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 275_02 / rijn41.c < prev   
Encoding:
C/C++ Source or Header  |  1980-01-01  |  22.0 KB  |  767 lines

  1.  
  2. /* rijn41.c                        */
  3. /* program for LCA41 option 'd'                */
  4. /* display de Bruijn diagram - 1st, 2nd, & 3rd gen    */
  5. /* Harold V. McIntosh, 20 February 1988            */
  6. /* 21 February 1988 - add j0=i0; to Pass 4's [HVM]    */
  7.  
  8. /*    Copyright (C) 1987    */
  9. /*    Copyright (C) 1988    */
  10. /*    Harold V. McIntosh    */
  11. /*    Gerardo Cisneros S.    */
  12.  
  13. # define JX   0.8  /* x-center, de Bruijn diagram    */
  14. # define JY   0.5  /* y-center, de Bruijn diagram    */
  15. # define RI 0.455  /* inner radius, de Bruijn diagram    */
  16. # define RO 0.475  /* outer radius, de Bruijn diagram    */
  17. # define NW    24  /* pause after so many lines        */
  18. # define MC    1  /* maximum colums - line control    */
  19.  
  20. int  dd;       /* # points in de Bruijn ring    */
  21. int  nc, nl;       /* no. columns, no. lines        */
  22.  
  23. /* edit the de Bruijn diagram */
  24. edijn() {char c;
  25.  
  26.   clijn();
  27.   dd=KK*KK;
  28.   ijn(dd,KK,2);
  29.   while (0<1) {
  30.   videocursor(0,0,36);
  31.   videoputc('?',2);
  32.   c=kbdin();
  33.   if (c=='\015') break;
  34.   videocursor(0,0,38);
  35.   videoputc(c,2);
  36.   videocursor(0,0,36);
  37.   videoputc(' ',2);
  38.   videoscroll(1,0,24,14,0,0);
  39.   videocursor(0,0,0);
  40.   kwait(3);
  41.   switch (c) {
  42.     case 'A': dd=KK*KK; ijn(dd,KK,2); sijn(dd,0,1); break;
  43.     case 'B': dd=KK*KK; ijn(dd,KK,2); sijn(dd,1,1); break;
  44.     case 'C': dd=KK*KK; ijn(dd,KK,2); sijn(dd,2,1); break;
  45.     case 'D': dd=KK*KK; ijn(dd,KK,2); sijn(dd,3,1); break;
  46.     case 'E': dd=KK*KK; ijn(dd,KK,2); zijn(dd,0,1); break;
  47.     case 'F': dd=KK*KK; ijn(dd,KK,2); zijn(dd,1,1); break;
  48.     case 'G': dd=KK*KK; ijn(dd,KK,2); zijn(dd,2,1); break;
  49.     case 'a': kwait(0); printf("Precursors 0*:"); kwait(0); xpass1(0); break;
  50.     case 'b': kwait(0); printf("Precursors 1*:"); kwait(0); xpass1(1); break;
  51.     case 'c': kwait(0); printf("Precursors 2*:"); kwait(0); xpass1(2); break;
  52.     case 'd': kwait(0); printf("Precursors 3*:"); kwait(0); xpass1(3); break;
  53.     case 'e': kwait(0); printf("(1,1) gliders:");  kwait(0); apass1(0); break;
  54.     case 'f': kwait(0); printf("(1,0) static:");   kwait(0); apass1(1); break;
  55.     case 'g': kwait(0); printf("(1,-1) gliders:"); kwait(0); apass1(2); break;
  56.     case 'h': kwait(0); printf("(2,-2) gliders:"); kwait(0); bpass1(0); break;
  57.     case 'i': kwait(0); printf("(2,-1) gliders:"); kwait(0); bpass1(1); break;
  58.     case 'j': kwait(0); printf("(2,0) cycles:");   kwait(0); bpass1(2); break;
  59.     case 'k': kwait(0); printf("(2,1) gliders:");  kwait(0); bpass1(3); break;
  60.     case 'l': kwait(0); printf("(2,2) gliders:");  kwait(0); bpass1(4); break;
  61.     case 'm': kwait(0); printf("(3,-3) gliders:"); kwait(0); cpass1(0); break;
  62.     case 'n': kwait(0); printf("(3,-2) gliders:"); kwait(0); cpass1(1); break;
  63.     case 'o': kwait(0); printf("(3,-1) gliders:"); kwait(0); cpass1(2); break;
  64.     case 'p': kwait(0); printf("(3,0) cycles:");   kwait(0); cpass1(3); break;
  65.     case 'q': kwait(0); printf("(3,1) gliders:");  kwait(0); cpass1(4); break;
  66.     case 'r': kwait(0); printf("(3,2) gliders:");  kwait(0); cpass1(5); break;
  67.     case 's': kwait(0); printf("(3,3) gliders:");  kwait(0); cpass1(6); break;
  68.     case '1': dd=KK*KK; clijn(); ijn(dd,KK,2); break;
  69.     case '2': dd=KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  70.     case '3': dd=KK*KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  71.     case '4': dd=KK*KK*KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  72.     case '+': videopalette(WHCYMAG); break;
  73.     case '-': videopalette(YELREGR); break;
  74.     case '?': case '/': clijn(); break;
  75.     default: break;
  76.     }; /* end switch */
  77.   };   /* end while  */
  78.   videopalette(WHCYMAG);
  79.   videomode(T80X25);
  80. }
  81.  
  82. /* clear edijn screen and set up menu */
  83. clijn() {
  84.   videomode(COLGRAF);
  85.   videopalette(YELREGR);
  86.   videocursor(0,0,0);
  87.   hscrrul();
  88.   videocursor(0,3,0);
  89.   printf("de Bruijn ring\n\n");
  90.   printf("efg   - (1,x)\n");
  91.   printf("EFG   - (all)\n");
  92.   printf("hijkl - (2,x)\n");
  93.   printf("mnopqrs (3,x)\n");
  94.   printf("1234  - diagram\n");
  95.   printf("abcd  - x*\n");
  96.   printf("ABCD  - full\n");
  97.   printf("+-  - palette\n");
  98.   printf("?/  - clr scrn\n");
  99.   printf("<cr> - exit\n\n");
  100. }
  101.  
  102. /* generate a de Bruijn diagram with m nodes, n links per node, color l */
  103. ijn(m,n,l) int m, n, l; {
  104. int    i, j;
  105. double ii, jj, nn, x, y, t, h;
  106. double sin(), cos();
  107. nn=(double)(n);
  108. t=6.28318/((double)(m));
  109. h=0.5*t;
  110. for (i=0; i<m; i++) {
  111.   ii=(double)(i);
  112.   for (j=0; j<n; j++) {
  113.     jj=(double)(j);
  114.     x=JX-RI*sin(ii*t+h);
  115.     y=JY-RI*cos(ii*t+h);
  116.     videoline(x,y,0);
  117.     x=JX-RO*sin((nn*ii+jj)*t+h);
  118.     y=JY-RO*cos((nn*ii+jj)*t+h);
  119.     videoline(x,y,l);
  120.     };
  121.   };
  122. }
  123.  
  124. /* insert a link into a de Bruijn diagram */
  125. /* m - number of vertices */
  126. /* u - initial vertex     */
  127. /* v - terminal vertex    */
  128. /* l - color of link      */
  129. lijnk(m,u,v,l) int m, u, v, l; {
  130. double uu, vv, x, y, t, h;
  131. double sin(), cos();
  132. t=6.28318/((double)(m));
  133. uu=t*((double)(u));
  134. vv=t*((double)(v));
  135. h=0.5*t;
  136. x=JX-RI*sin(uu+h);
  137. y=JY-RI*cos(uu+h);
  138. videoline(x,y,0);
  139. x=JX-RO*sin(vv+h);
  140. y=JY-RO*cos(vv+h);
  141. videoline(x,y,l);
  142. }
  143.  
  144. /* generate a de Bruijn diagram showing antecedents of state k in color l */
  145. sijn(m,k,l) int m, k, l; {
  146. int    i0, i1, i2;
  147. double th, x, y, t, h;
  148. double sin(), cos();
  149. t=6.28318/((double)(m));
  150. h=0.5*t;
  151. for (i0=0; i0<KK; i0++) {
  152. for (i1=0; i1<KK; i1++) {
  153. for (i2=0; i2<KK; i2++) {
  154.   if (k==ascrule[i0][i1][i2]-'0') {
  155.     th=((double)(i0*KK+i1))*t+h;
  156.     x=JX-RI*sin(th);
  157.     y=JY-RI*cos(th);
  158.     videoline(x,y,0);
  159.     th=((double)(i1*KK+i2))*t+h;
  160.     x=JX-RO*sin(th);
  161.     y=JY-RO*cos(th);
  162.     videoline(x,y,l);
  163.     };       /* end if    */
  164.   };};};   /* end for's */
  165. }       /* end sijn  */
  166.  
  167. /* generate a de Bruijn diagram showing the (1,k) links in color l */
  168. zijn(m,k,l) int m, k, l; {
  169. int    i, i0, i1, i2;
  170. double th, x, y, t, h;
  171. double sin(), cos();
  172. t=6.28318/((double)(m));
  173. h=0.5*t;
  174. for (i0=0; i0<KK; i0++) {
  175. for (i1=0; i1<KK; i1++) {
  176. for (i2=0; i2<KK; i2++) {
  177.   i=ascrule[i0][i1][i2]-'0';
  178.   if ((k==0 && i==i0) || (k==1 && i==i1) || (k==2 && i==i2)) {
  179.     th=((double)(i0*KK+i1))*t+h;
  180.     x=JX-RI*sin(th);
  181.     y=JY-RI*cos(th);
  182.     videoline(x,y,0);
  183.     th=((double)(i1*KK+i2))*t+h;
  184.     x=JX-RO*sin(th);
  185.     y=JY-RO*cos(th);
  186.     videoline(x,y,l);
  187.     };       /* end if    */
  188.   };};};   /* end for's */
  189. }       /* end zijn  */
  190.  
  191. /* plot graph on video screen            */
  192. /* move pen from present position to (x,y) */
  193. /* raised if l=0; color l if l>0       */
  194. videoline(x,y,l) double x, y; int l; {
  195. int k, ax, ay, dx, dy, di, dj, x1, y1;
  196. /* if (x<0.0) return; if (x>1.0) return */
  197. /* if (y<0.0) return; if (y>1.0) return */
  198. x1=(int)(199.0*(1.0-y));
  199. y1=(int)(199.0*x);
  200. dx=x1-ix0;
  201. dy=y1-iy0;
  202. ax=dx>=0?dx:-dx;
  203. ay=dy>=0?dy:-dy;
  204. di=dx>=0?1:-1; if (dx==0) di=0;
  205. dj=dy>=0?1:-1; if (dy==0) dj=0;
  206.  
  207. if (l>0) {if (ax!=0 || ay!=0) {
  208.   if (ax>=ay) {for (k=0; k<=ax; k++) videodot(ix0+di*k,60+iy0+(k*dy)/ax,l);}
  209.      else {for (k=0; k<=ay; k++) videodot(ix0+(k*dx)/ay,60+iy0+dj*k,l);};
  210.   }; };
  211. ix0=x1;
  212. iy0=y1;
  213. }
  214.  
  215. /* approximation to sine */
  216. double sin(x) double x; {
  217. if (x<0.0) return(-sin(-x));
  218. while (x>=6.28318) x-=6.28318;
  219. if (x>=3.142) return(-sin(x-3.14159));
  220. if (x>=1.571) return(sin(3.14159-x));
  221. return(x*(1.0-0.166*(x*x-0.05*x*x)));
  222. }
  223.  
  224. /* approximation to cosine */
  225. double cos(x) double x; {double sin(); return(sin(x+1.57079));}
  226.  
  227. /* ONE41.C */
  228.  
  229. /* Pass 1a analyzes all the configurations which fulfil (1,-1+l) */
  230. apass1(l) {
  231. char arry[KK][KK][KK];
  232. int  i,j,k,m;
  233. asctobin();
  234. printf(" Pass1a\015");
  235. for (i=0; i<KK; i++) {
  236. for (j=0; j<KK; j++) {
  237. for (k=0; k<KK; k++) {
  238.   switch (l) {
  239.     case 0: m=i; break;
  240.     case 1: m=j; break;
  241.     case 2: m=k; break;
  242.     default: break;};
  243.   arry[i][j][k]=binrule[i][j][k]==m?'Y':'N';
  244.   };};};
  245. apass2i(arry);
  246. apass2o(arry);
  247. apass4(arry);
  248. }
  249.  
  250. /* Pass 1x analyzes all the configurations mapping into a constant */
  251. xpass1(c) int c; {
  252. char arry[KK][KK][KK];
  253. int  i,j,k;
  254. asctobin();
  255. printf(" Pass1a\015");
  256. for (i=0; i<KK; i++) {
  257. for (j=0; j<KK; j++) {
  258. for (k=0; k<KK; k++) {
  259.   arry[i][j][k]=binrule[i][j][k]==c?'Y':'N';
  260.   };};};
  261. apass2i(arry);
  262. apass2o(arry);
  263. apass4(arry);
  264. }
  265.  
  266. /* Pass 2i flags all links with an incoming arrow */
  267. /* Pass 2o flags all links with an outgoing arrow */
  268. /* Then pass 3 discards all unflagged links */
  269. /* Passes 2 and 3 alternate until no change is observed */
  270.  
  271. apass2i(arry) char arry[KK][KK][KK]; {int i,j,k,m;
  272. do {
  273. printf(" Pass2i\015");
  274. for (i=0; i<KK; i++) {
  275. for (j=0; j<KK; j++) {
  276. for (k=0; k<KK; k++) {
  277. if ((arry[i][j][k]&0x5F)=='Y') {for (m=0; m<KK; m++) arry[j][k][m]|=0x20;};
  278. };};}; } while (apass3(arry)!=0); }
  279.  
  280. apass2o(arry) char arry[KK][KK][KK]; {int i,j,k,m;
  281. do {
  282. printf(" Pass2o\015");
  283. for (i=0; i<KK; i++) {
  284. for (j=0; j<KK; j++) {
  285. for (k=0; k<KK; k++) {
  286. if ((arry[i][j][k]&0x5F)=='Y') {for (m=0; m<KK; m++) arry[m][i][j]|=0x20;};
  287. };};}; } while (apass3(arry)!=0); }
  288.  
  289. /* Pass 3 - erase flags, mark survivors, count changes */
  290.  
  291. int apass3(arry) char arry[KK][KK][KK]; {int i,j,k,l;
  292. l=0;
  293. printf(" Pass3 \015");
  294. for (i=0; i<KK; i++) {
  295. for (j=0; j<KK; j++) {
  296. for (k=0; k<KK; k++) {
  297.   switch (arry[i][j][k]) {
  298.     case 'y': arry[i][j][k]='Y'; break;
  299.     case 'Y': arry[i][j][k]='N'; l=1; break;
  300.     case 'n': case 'N': arry[i][j][k]='N'; break;
  301.     default: break; };
  302. };};};
  303. return l;
  304. }
  305.  
  306. /* Pass 4 - print the loops which remain */
  307. apass4(arry) char arry[KK][KK][KK]; {
  308. int i0, i1, i2;
  309. int j0, j1, j2;
  310. int k, l, m;
  311. printf(" pass4 \015");
  312. for (i0=0; i0<KK; i0++) {
  313. for (i1=0; i1<KK; i1++) {
  314. for (i2=0; i2<KK; i2++) {
  315. j0=i0; j1=i1; j2=i2; l=0; m=0;
  316. do {
  317.         if (arry[0][j1][j2]=='Y')
  318.     {arry[0][j1][j2]='y';
  319.     k=j2; j2=j1; j1=0; m=1;}
  320.   else {if (arry[1][j1][j2]=='Y')
  321.     {arry[1][j1][j2]='y';
  322.     k=j2; j2=j1; j1=1; m=1;}
  323.   else {if (arry[2][j1][j2]=='Y')
  324.     {arry[2][j1][j2]='y';
  325.     k=j2; j2=j1; j1=2; m=1;}
  326.   else {if (arry[3][j1][j2]=='Y')
  327.     {arry[3][j1][j2]='y';
  328.     k=j2; j2=j1; j1=3; m=1;}
  329.   else {l=1; if (m==1) {j0=j1; j1=j2; j2=k;}; };};};};
  330.   } while (l==0);
  331. l=0; 
  332. m=0;
  333. do {
  334.         if (arry[j0][j1][0]=='y')
  335.    {aprf(j0,j1,0);
  336.    arry[j0][j1][0]='N';
  337.    j0=j1; j1=0; m=1;}
  338.   else {if (arry[j0][j1][1]=='y')
  339.    {aprf(j0,j1,1);
  340.    arry[j0][j1][1]='N';
  341.    j0=j1; j1=1; m=1;}
  342.   else {if (arry[j0][j1][2]=='y')
  343.    {aprf(j0,j1,2);
  344.    arry[j0][j1][2]='N';
  345.    j0=j1; j1=2; m=1;}
  346.   else {if (arry[j0][j1][3]=='y')
  347.    {aprf(j0,j1,3);
  348.    arry[j0][j1][3]='N';
  349.    j0=j1; j1=3; m=1;}
  350.   else {l=1;};};};};
  351.   } while (l==0);
  352. l=0;
  353. do {
  354.         if (arry[j0][j1][0]=='Y')
  355.    {aprf(j0,j1,0);
  356.    arry[j0][j1][0]='N';
  357.    j0=j1; j1=0; m=1;}
  358.   else {if (arry[j0][j1][1]=='Y')
  359.    {aprf(j0,j1,1);
  360.    arry[j0][j1][1]='N';
  361.    j0=j1; j1=1; m=1;}
  362.   else {if (arry[j0][j1][2]=='Y')
  363.    {aprf(j0,j1,2);
  364.    arry[j0][j1][2]='N';
  365.    j0=j1; j1=2; m=1;}
  366.   else {if (arry[j0][j1][3]=='Y')
  367.    {aprf(j0,j1,3);
  368.    arry[j0][j1][3]='N';
  369.    j0=j1; j1=3; m=1;}
  370.   else {l=1; if (m==1) kwait(0);};};};};
  371.   } while (l==0);
  372. };};};
  373. }
  374.  
  375. /* print one link of the de Bruijn diagram */
  376. aprf(i,j,k) int i, j, k; {
  377. kwait(1);
  378. printf("%1d",i);
  379. printf("%1d",j);
  380. printf("-");
  381. printf("%1d",k);
  382. printf(" ");
  383. lijnk(dd,i*KK+j,j*KK+k,3);
  384. }
  385.  
  386. /* TWO41.C */
  387.  
  388. /* Pass 1 analyzes all sequences conforming to (2,-2+l)  */
  389. bpass1(l) int l; {
  390. char arry[KK][KK][KK][KK][KK];
  391. int  i0, i1, i2, i3, i4;
  392. int  i, j, k, m;
  393. asctobin();
  394. printf(" Pass1a\015");
  395. for (i0=0; i0<KK; i0++) {
  396. for (i1=0; i1<KK; i1++) {
  397. for (i2=0; i2<KK; i2++) {
  398. for (i3=0; i3<KK; i3++) {
  399. for (i4=0; i4<KK; i4++) {
  400.   i=binrule[i0][i1][i2];
  401.   j=binrule[i1][i2][i3];
  402.   k=binrule[i2][i3][i4];
  403.   switch (l) {
  404.     case 0: m=i0; break;
  405.     case 1: m=i1; break;
  406.     case 2: m=i2; break;
  407.     case 3: m=i3; break;
  408.     case 4: m=i4; break;
  409.     default: break;};
  410.   arry[i0][i1][i2][i3][i4]=binrule[i][j][k]==m?'Y':'N';
  411.   };};};};};
  412. bpass2i(arry);
  413. bpass2o(arry);
  414. bpass4(arry);
  415. }
  416.  
  417. /* Passs 2i flags links which have an incoming arrow */
  418. bpass2i(arry) char arry[KK][KK][KK][KK][KK]; {
  419. int i0, i1, i2, i3, i4, m;
  420. printf(" Pass2i\015");
  421. do {
  422. for (i0=0; i0<KK; i0++) {
  423. for (i1=0; i1<KK; i1++) {
  424. for (i2=0; i2<KK; i2++) {
  425. for (i3=0; i3<KK; i3++) {
  426. for (i4=0; i4<KK; i4++) {
  427. if ((arry[i0][i1][i2][i3][i4]&0x5F)=='Y')
  428.  {for (m=0; m<KK; m++) arry[i1][i2][i3][i4][m]|=0x20;};
  429. };};};};};
  430. } while (bpass3(arry)!=0); }
  431.  
  432. /* Passs 2o flags links which have an outgoing arrow */
  433. bpass2o(arry) char arry[KK][KK][KK][KK][KK]; {
  434. int i0, i1, i2, i3, i4, m;
  435. do {
  436. printf(" Pass2o\015");
  437. for (i0=0; i0<KK; i0++) {
  438. for (i1=0; i1<KK; i1++) {
  439. for (i2=0; i2<KK; i2++) {
  440. for (i3=0; i3<KK; i3++) {
  441. for (i4=0; i4<KK; i4++) {
  442. if ((arry[i0][i1][i2][i3][i4]&0x5F)=='Y')
  443.  {for (m=0; m<KK; m++) arry[m][i0][i1][i2][i3]|=0x20;};
  444. };};};};};
  445. } while (bpass3(arry)!=0); }
  446.  
  447. /*  Pass 3 erases flags, marks survivors, counts channges */
  448. int bpass3(arry) char arry[KK][KK][KK][KK][KK]; {
  449. int i0, i1, i2, i3, i4, l;
  450. printf(" Pass3 \015");
  451. l=0;
  452. for (i0=0; i0<KK; i0++) {
  453. for (i1=0; i1<KK; i1++) {
  454. for (i2=0; i2<KK; i2++) {
  455. for (i3=0; i3<KK; i3++) {
  456. for (i4=0; i4<KK; i4++) {
  457. switch (arry[i0][i1][i2][i3][i4]) {
  458.     case 'y': arry[i0][i1][i2][i3][i4]='Y'; break;
  459.     case 'Y': arry[i0][i1][i2][i3][i4]='N'; l=1; break;
  460.     case 'n': case 'N': arry[i0][i1][i2][i3][i4]='N'; break;
  461.     default: break; };
  462. };};};};};
  463. return l;
  464. }
  465.  
  466. /* Pass 4 prints any loops which remain */
  467. bpass4(arry) char arry[KK][KK][KK][KK][KK]; {
  468. int i0, i1, i2, i3, i4;
  469. int j0, j1, j2, j3, j4, k, l, m;
  470. printf(" pass4 \015");
  471. for (i0=0; i0<KK; i0++) {
  472. for (i1=0; i1<KK; i1++) {
  473. for (i2=0; i2<KK; i2++) {
  474. for (i3=0; i3<KK; i3++) {
  475. for (i4=0; i4<KK; i4++) {
  476. j0=i0; j1=i1; j2=i2; j3=i3; j4=i4; l=0; m=0;
  477. do {
  478.         if (arry[0][j1][j2][j3][j4]=='Y')
  479.     {arry[0][j1][j2][j3][j4]='y';
  480.     k=j4; j4=j3; j3=j2; j2=j1; j1=0; m=1;}
  481.   else {if (arry[1][j1][j2][j3][j4]=='Y')
  482.     {arry[1][j1][j2][j3][j4]='y';
  483.     k=j4; j4=j3; j3=j2; j2=j1; j1=1; m=1;}
  484.   else {if (arry[2][j1][j2][j3][j4]=='Y')
  485.     {arry[2][j1][j2][j3][j4]='y';
  486.     k=j4; j4=j3; j3=j2; j2=j1; j1=2; m=1;}
  487.   else {if (arry[3][j1][j2][j3][j4]=='Y')
  488.     {arry[3][j1][j2][j3][j4]='y';
  489.     k=j4; j4=j3; j3=j2; j2=j1; j1=3; m=1;}
  490.   else {l=1; if (m==1) {j0=j1; j1=j2; j2=j3; j3=j4; j4=k;}; };};};};
  491.   } while (l==0);
  492. l=0; 
  493. m=0;
  494. do {
  495.         if (arry[j0][j1][j2][j3][0]=='y')
  496.    {bprf(j0,j1,j2,j3,0);
  497.    arry[j0][j1][j2][j3][0]='N';
  498.    j0=j1; j1=j2; j2=j3; j3=0; m=1;}
  499.   else {if (arry[j0][j1][j2][j3][1]=='y')
  500.    {bprf(j0,j1,j2,j3,1);
  501.    arry[j0][j1][j2][j3][1]='N';
  502.    j0=j1; j1=j2; j2=j3; j3=1; m=1;}
  503.   else {if (arry[j0][j1][j2][j3][2]=='y')
  504.    {bprf(j0,j1,j2,j3,2);
  505.    arry[j0][j1][j2][j3][2]='N';
  506.    j0=j1; j1=j2; j2=j3; j3=2; m=1;}
  507.   else {if (arry[j0][j1][j2][j3][3]=='y')
  508.    {bprf(j0,j1,j2,j3,3);
  509.    arry[j0][j1][j2][j3][3]='N';
  510.    j0=j1; j1=j2; j2=j3; j3=3; m=1;}
  511.   else {l=1;};};};};
  512.   } while (l==0);
  513. l=0;
  514. do {
  515.         if (arry[j0][j1][j2][j3][0]=='Y')
  516.    {bprf(j0,j1,j2,j3,0);
  517.    arry[j0][j1][j2][j3][0]='N';
  518.    j0=j1; j1=j2; j2=j3; j3=0; m=1;}
  519.   else {if (arry[j0][j1][j2][j3][1]=='Y')
  520.    {bprf(j0,j1,j2,j3,1);
  521.    arry[j0][j1][j2][j3][1]='N';
  522.    j0=j1; j1=j2; j2=j3; j3=1; m=1;}
  523.   else {if (arry[j0][j1][j2][j3][2]=='Y')
  524.    {bprf(j0,j1,j2,j3,2);
  525.    arry[j0][j1][j2][j3][2]='N';
  526.    j0=j1; j1=j2; j2=j3; j3=2; m=1;}
  527.   else {if (arry[j0][j1][j2][j3][3]=='Y')
  528.    {bprf(j0,j1,j2,j3,3);
  529.    arry[j0][j1][j2][j3][3]='N';
  530.    j0=j1; j1=j2; j2=j3; j3=3; m=1;}
  531.   else {l=1; if (m==1) {kwait(0);} ;};};};};
  532.   } while (l==0);
  533. };};};};};
  534. }
  535.  
  536. /* print one of the links in a chain */
  537. bprf(i0,i1,i2,i3,i4) int i0, i1,i2, i3, i4; {
  538. kwait(1);
  539. printf("%1d",i0);
  540. printf("%1d",i1);
  541. printf("%1d",i2);
  542. printf("%1d",i3);
  543. printf("-");
  544. printf("%1d",i4);
  545. printf(" ");
  546. lijnk(dd,((i0*KK+i1)*KK+i2)*KK+i3,((i1*KK+i2)*KK+i3)*KK+i4,3);
  547. }
  548.  
  549. /* THREE41.C */
  550.  
  551. /* Pass 1 marks sequences conforming to (3,-3+l) */
  552. cpass1(l) int l; {
  553. char arry[KK][KK][KK][KK][KK][KK][KK];
  554. int  i0, i1, i2, i3, i4, i5, i6;
  555. int  j0, j1, j2, j3, j4;
  556. int  i, j, k, m;
  557. asctobin();
  558. printf(" pass1 \015");
  559. for (i0=0; i0<KK; i0++) {
  560. for (i1=0; i1<KK; i1++) {
  561. for (i2=0; i2<KK; i2++) {
  562. for (i3=0; i3<KK; i3++) {
  563. for (i4=0; i4<KK; i4++) {
  564. for (i5=0; i5<KK; i5++) {
  565. for (i6=0; i6<KK; i6++) {
  566. j0=binrule[i0][i1][i2];
  567. j1=binrule[i1][i2][i3];
  568. j2=binrule[i2][i3][i4];
  569. j3=binrule[i3][i4][i5];
  570. j4=binrule[i4][i5][i6];
  571. i=binrule[j0][j1][j2];
  572. j=binrule[j1][j2][j3];
  573. k=binrule[j2][j3][j4];
  574. switch (l) {
  575.   case 0: m=i0; break;
  576.   case 1: m=i1; break;
  577.   case 2: m=i2; break;
  578.   case 3: m=i3; break;
  579.   case 4: m=i4; break;
  580.   case 5: m=i5; break;
  581.   case 6: m=i6; break;
  582.   default: break;};
  583. arry[i0][i1][i2][i3][i4][i5][i6]=binrule[i][j][k]==m?'Y':'N';
  584. };};};};};};};
  585. cpass2i(arry);
  586. cpass2o(arry);
  587. cpass4(arry);
  588. }
  589.  
  590. /* Pass 2i flags links which have an incoming arrow */
  591. cpass2i(arry) char arry[KK][KK][KK][KK][KK][KK][KK]; {
  592. int i0, i1, i2, i3, i4, i5, i6, m;
  593. do {
  594. printf(" pass2i\015");
  595. for (i0=0; i0<KK; i0++) {
  596. for (i1=0; i1<KK; i1++) {
  597. for (i2=0; i2<KK; i2++) {
  598. for (i3=0; i3<KK; i3++) {
  599. for (i4=0; i4<KK; i4++) {
  600. for (i5=0; i5<KK; i5++) {
  601. for (i6=0; i6<KK; i6++) {
  602. if ((arry[i0][i1][i2][i3][i4][i5][i6]&0x5F)=='Y')
  603.  {for (m=0; m<KK; m++) arry[i1][i2][i3][i4][i5][i6][m]|=0x20;};
  604. };};};};};};};
  605. } while (cpass3(arry)!=0); }
  606.  
  607. /* Pass 2o flags links which have an outgoing arrow */
  608. cpass2o(arry) char arry[KK][KK][KK][KK][KK][KK][KK]; {
  609. int i0, i1, i2, i3, i4, i5, i6, m;
  610. do {
  611. printf(" pass2o\015");
  612. for (i0=0; i0<KK; i0++) {
  613. for (i1=0; i1<KK; i1++) {
  614. for (i2=0; i2<KK; i2++) {
  615. for (i3=0; i3<KK; i3++) {
  616. for (i4=0; i4<KK; i4++) {
  617. for (i5=0; i5<KK; i5++) {
  618. for (i6=0; i6<KK; i6++) {
  619. if ((arry[i0][i1][i2][i3][i4][i5][i6]&0x5F)=='Y')
  620.  {for (m=0; m<KK; m++) arry[m][i0][i1][i2][i3][i4][i5]|=0x20;};
  621. };};};};};};};
  622. } while (cpass3(arry)!=0); }
  623.  
  624. /*  Pass 3 erases flags, marks survivors, counts channges */
  625. int cpass3(arry) char arry[KK][KK][KK][KK][KK][KK][KK]; {
  626. int i0, i1, i2, i3, i4, i5, i6, l;
  627. l=0;
  628. printf(" pass3 \015");
  629. for (i0=0; i0<KK; i0++) {
  630. for (i1=0; i1<KK; i1++) {
  631. for (i2=0; i2<KK; i2++) {
  632. for (i3=0; i3<KK; i3++) {
  633. for (i4=0; i4<KK; i4++) {
  634. for (i5=0; i5<KK; i5++) {
  635. for (i6=0; i6<KK; i6++) {
  636. switch (arry[i0][i1][i2][i3][i4][i5][i6]) {
  637.     case 'y': arry[i0][i1][i2][i3][i4][i5][i6]='Y'; break;
  638.     case 'Y': arry[i0][i1][i2][i3][i4][i5][i6]='N'; l=1; break;
  639.     case 'n': case 'N': arry[i0][i1][i2][i3][i4][i5][i6]='N'; break;
  640.     default: break; };
  641. };};};};};};};
  642. return l; }
  643.  
  644. /* Pass 4 prints the loops which remain */
  645. cpass4(arry) char arry[KK][KK][KK][KK][KK][KK][KK]; {
  646. int i0, i1, i2, i3, i4, i5, i6;
  647. int j0, j1, j2, j3, j4, j5, j6;
  648. int  k, l, m;
  649. printf(" pass4 \015");
  650. for (i0=0; i0<KK; i0++) {
  651. for (i1=0; i1<KK; i1++) {
  652. for (i2=0; i2<KK; i2++) {
  653. for (i3=0; i3<KK; i3++) {
  654. for (i4=0; i4<KK; i4++) {
  655. for (i5=0; i5<KK; i5++) {
  656. for (i6=0; i6<KK; i6++) {
  657. j0=i0; j1=i1; j2=i2; j3=i3; j4=i4; j5=i5; j6=i6;
  658. l=0;
  659. m=0;
  660. do {
  661.         if (arry[0][j1][j2][j3][j4][j5][j6]=='Y')
  662.     {arry[0][j1][j2][j3][j4][j5][j6]='y';
  663.     k=j6; j6=j5; j5=j4; j4=j3; j3=j2; j2=j1; j1=0; m=1;}
  664.   else {if (arry[1][j1][j2][j3][j4][j5][j6]=='Y')
  665.     {arry[1][j1][j2][j3][j4][j5][j6]='y';
  666.     k=j6; j6=j5; j5=j4; j4=j3; j3=j2; j2=j1; j1=1; m=1;}
  667.   else {if (arry[2][j1][j2][j3][j4][j5][j6]=='Y')
  668.     {arry[2][j1][j2][j3][j4][j5][j6]='y';
  669.     k=j6; j6=j5; j5=j4; j4=j3; j3=j2; j2=j1; j1=2; m=1;}
  670.   else {if (arry[3][j1][j2][j3][j4][j5][j6]=='Y')
  671.     {arry[3][j1][j2][j3][j4][j5][j6]='y';
  672.     k=j6; j6=j5; j5=j4; j4=j3; j3=j2; j2=j1; j1=3; m=1;}
  673.   else {l=1;
  674.     if (m==1) {j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=j6; j6=k;};
  675.     };};};};
  676.   } while (l==0);
  677. l=0; 
  678. m=0;
  679. do {
  680.         if (arry[j0][j1][j2][j3][j4][j5][0]=='y')
  681.    {cprf(j0,j1,j2,j3,j4,j5,0);
  682.    arry[j0][j1][j2][j3][j4][j5][0]='N';
  683.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=0; m=1;}
  684.   else {if (arry[j0][j1][j2][j3][j4][j5][1]=='y')
  685.    {cprf(j0,j1,j2,j3,j4,j5,1);
  686.    arry[j0][j1][j2][j3][j4][j5][1]='N';
  687.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=1; m=1;}
  688.   else {if (arry[j0][j1][j2][j3][j4][j5][2]=='y')
  689.    {cprf(j0,j1,j2,j3,j4,j5,2);
  690.    arry[j0][j1][j2][j3][j4][j5][2]='N';
  691.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=2; m=1;}
  692.   else {if (arry[j0][j1][j2][j3][j4][j5][3]=='y')
  693.    {cprf(j0,j1,j2,j3,j4,j5,3);
  694.    arry[j0][j1][j2][j3][j4][j5][3]='N';
  695.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=3; m=1;}
  696.   else {l=1;};};};};
  697.   } while (l==0);
  698. l=0;
  699. do {
  700.         if (arry[j0][j1][j2][j3][j4][j5][0]=='Y')
  701.    {cprf(j0,j1,j2,j3,j4,j5,0);
  702.    arry[j0][j1][j2][j3][j4][j5][0]='N';
  703.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=0; m=1;}
  704.   else {if (arry[j0][j1][j2][j3][j4][j5][1]=='Y')
  705.    {cprf(j0,j1,j2,j3,j4,j5,1);
  706.    arry[j0][j1][j2][j3][j4][j5][1]='N';
  707.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=1; m=1;}
  708.   else {if (arry[j0][j1][j2][j3][j4][j5][2]=='Y')
  709.    {cprf(j0,j1,j2,j3,j4,j5,2);
  710.    arry[j0][j1][j2][j3][j4][j5][2]='N';
  711.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=2; m=1;}
  712.   else {if (arry[j0][j1][j2][j3][j4][j5][3]=='Y')
  713.    {cprf(j0,j1,j2,j3,j4,j5,3);
  714.    arry[j0][j1][j2][j3][j4][j5][3]='N';
  715.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=3; m=1;}
  716.   else {l=1; if (m==1) kwait(0);};};};};
  717.   } while (l==0);
  718. };};};};};};};
  719. }
  720.  
  721. /* print one of the individual links in a chain */
  722. cprf(i0,i1,i2,i3,i4,i5,i6)
  723. int i0, i1, i2, i3, i4, i5, i6; {int i, j;
  724. kwait(1);
  725. printf("%1d",i0);
  726. printf("%1d",i1);
  727. printf("%1d",i2);
  728. printf("%1d",i3);
  729. printf("%1d",i4);
  730. printf("%1d",i5);
  731. printf("-");
  732. printf("%1d",i6);
  733. printf(" ");
  734. i=((((i0*KK+i1)*KK+i2)*KK+i3)*KK+i4)*KK+i5;
  735. j=((((i1*KK+i2)*KK+i3)*KK+i4)*KK+i5)*KK+i6;
  736. lijnk(dd,i,j,3);
  737. }
  738.  
  739. /* FOUR41.C */
  740. /* insufficient space for the array */
  741.  
  742. /* pause at the end of a full screen        */
  743. /* kwait(0) - short or null line        */
  744. /* kwait(1) - split long lines as necessary */
  745. /* kwait(2) - wait to continue            */
  746. /* kwait(3) - reset                 */
  747. kwait(i) int i; {
  748. switch (i) {
  749.   case 0: printf("\n"); nc=0; nl++; break;
  750.   case 1: if (nc==MC) {printf("&\n"); nc=1; nl++;} else nc++; break;
  751.   case 2: nl=NW; break;
  752.   case 3: nc=0; nl=0; break;
  753.   default: break;};
  754. if (nl==NW) {
  755.   nl=1;
  756.   printf(" press any key to continue\015");
  757.   while (kbdst()) {};
  758.   kbdin();
  759.   printf("                          \015");
  760.   videoscroll(1,0,24,14,0,0);
  761.   videocursor(0,0,0);
  762.   printf("\n");
  763.   };
  764. }
  765.  
  766. /* end */
  767.